package com.no1.musicmgr.util;

import org.springframework.util.DigestUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.rmi.RemoteException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileUtils {
    /**
     * 上传文件到指定路径
     *
     * @param filePath 文件路径，用于指定文件上传的位置
     * @param file 待上传的文件对象
     * @return 返回上传文件的名称
     * @throws IOException 如果文件读写出现错误
     */
    public static String uploadFile(String filePath, MultipartFile file) throws IOException
    {
        // 检查上传的文件是否为空
        if (file.isEmpty())
        {
            throw new RemoteException("文件不能为空");
        }
        // 获取文件的输入流
        InputStream inputStream = file.getInputStream();
        // 计算文件的MD5值，用于作为文件的唯一标识
        String md5 = getMD5(inputStream);
        // 调用修改后的 getExtension 方法获取当前时间作为文件扩展名
        String fileName = md5 + '-' + file.getOriginalFilename();
        // 将文件保存到指定路径
        saveFile(filePath, fileName, file);
        // 返回文件名
        return fileName;
    }


    /**
     * 根据上传的文件获取其扩展名
     * 实际上，这个方法并没有使用上传的文件参数，而是返回当前时间作为扩展名
     * 这可能是因为原始的意图是使用文件信息生成唯一的文件名，但实现时忽略了文件参数
     *
     * @param file 上传的文件，该参数在当前实现中未被使用
     * @return 返回当前时间格式化的字符串，用作文件的扩展名
     */
    private static String getExtension(MultipartFile file) {
        // 使用 SimpleDateFormat 来获取当前时间字符串
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss:SSS");
        // 将当前时间格式化为字符串，用作文件的扩展名
        return dateFormat.format(new Date());
    }



    /**
     * 获取文件的md5
     * 通过输入流计算文件的MD5散列值主要用于文件完整性校验
     * @param inputStream 输入流，用于读取文件内容
     * @return 文件的MD5值，以16进制字符串形式返回
     * @throws IOException 如果输入流读取或关闭时发生错误
     */
    public static String getMD5(InputStream inputStream) throws IOException {
        // 初始化md5值，用于存放计算结果
        String md5 = null;

        // 使用Apache Commons Codec库的DigestUtils工具类计算输入流的MD5散列值
        // DigestUtils.md5DigestAsHex方法将输入流数据转换为16进制的MD5字符串
        md5 = DigestUtils.md5DigestAsHex(inputStream);

        // 关闭输入流，释放资源，避免资源泄露
        inputStream.close();

        // 返回计算得到的MD5值
        return md5;
    }


    /**
     * 保存文件到指定路径
     *
     * @param path 文件保存的目录路径
     * @param fileName 文件名
     * @param multipartFile 待保存的文件对象
     * @throws IOException 如果文件写入失败
     * @throws RemoteException 如果目录创建失败
     */
    public static void saveFile(String path, String fileName, MultipartFile multipartFile) throws IOException {
        // 判断目录是否存在
        File directory = new File(path);
        if(!directory.exists()){
            // 尝试创建目录
            if (!directory.mkdirs()){
                throw new RemoteException("创建目录失败");
            }
        }
        // 写入文件
        File file = new File(path + fileName);
        // 如果文件不存在，则创建新文件
        if (file.createNewFile()){
            // 将multipartFile对象传输到file对象
            multipartFile.transferTo(file);
        }
    }

}
